/*!
 * \file WtHelper.cpp
 * \project	WonderTrader
 *
 * \author Wesley
 * \date 2020/03/30
 * 
 * \brief 助手函数实现文件
 * 
 * 本文件实现了WtHelper类的所有静态方法，主要包括：
 * 1. 路径管理功能的实现
 * 2. 目录创建和访问功能
 * 3. 静态成员变量的定义和初始化
 * 
 * 这些工具函数为整个WonderTrader系统提供基础支持。
 */
#include "WtHelper.h"

#include "../Share/StrUtil.hpp"
#include "../Share/StdUtils.hpp"

#include <boost/filesystem.hpp>

#ifdef _MSC_VER
#include <direct.h>
#else	//UNIX
#include <unistd.h>
#endif

// 静态成员变量定义
uint32_t WtHelper::_cur_date = 0;
uint32_t WtHelper::_cur_time = 0;
uint32_t WtHelper::_cur_secs = 0;
uint32_t WtHelper::_cur_tdate = 0;
std::string WtHelper::_inst_dir;
std::string WtHelper::_gen_dir = "./generated/";

/**
 * @brief 获取当前工作目录
 * @return 当前工作目录的标准化路径
 * 
 * 使用系统API获取当前工作目录，并进行路径标准化处理。
 * 结果会被缓存，避免重复调用系统API。
 */
std::string WtHelper::getCWD()
{
	static std::string _cwd;
	if(_cwd.empty())
	{
		char   buffer[256];
#ifdef _MSC_VER
		_getcwd(buffer, 255);
#else	//UNIX
		if (getcwd(buffer, 255) == NULL) {
			buffer[0] = '\0';  // 失败时清空缓冲区
		}
#endif
		_cwd = StrUtil::standardisePath(buffer);
	}	
	return _cwd;
}

/**
 * @brief 获取模块路径
 * @param moduleName 模块名称
 * @param subDir 子目录名称
 * @param isCWD 是否基于当前工作目录，默认为true
 * @return 完整的模块路径
 * 
 * 根据参数构建完整的模块路径，可以选择基于当前工作目录或实例目录。
 */
std::string WtHelper::getModulePath(const char* moduleName, const char* subDir, bool isCWD /* = true */)
{
	std::stringstream ss;
	ss << (isCWD?getCWD():getInstDir()) << subDir << "/" << moduleName;
	return ss.str();
}

/**
 * @brief 获取策略数据目录
 * @return 策略数据目录路径
 * 
 * 获取策略数据存储目录，如果目录不存在则自动创建。
 * 目录路径基于生成目录下的stradata子目录。
 */
const char* WtHelper::getStraDataDir()
{
	static std::string folder = StrUtil::standardisePath(_gen_dir) + "stradata/";
	if (!StdFile::exists(folder.c_str()))
		boost::filesystem::create_directories(folder);
	return folder.c_str();
}

/**
 * @brief 获取策略用户数据目录
 * @return 策略用户数据目录路径
 * 
 * 获取策略用户数据存储目录，如果目录不存在则自动创建。
 * 目录路径基于生成目录下的userdata子目录。
 */
const char* WtHelper::getStraUsrDatDir()
{
	static std::string folder = StrUtil::standardisePath(_gen_dir) + "userdata/";
	if (!StdFile::exists(folder.c_str()))
		boost::filesystem::create_directories(folder);
	return folder.c_str();
}

/**
 * @brief 获取组合目录
 * @return 组合目录路径
 * 
 * 获取投资组合数据存储目录，如果目录不存在则自动创建。
 * 目录路径基于生成目录下的portfolio子目录。
 */
const char* WtHelper::getPortifolioDir()
{
	static std::string folder = StrUtil::standardisePath(_gen_dir) + "portfolio/";
	if (!StdFile::exists(folder.c_str()))
		boost::filesystem::create_directories(folder);
	return folder.c_str();
}

/**
 * @brief 获取输出目录
 * @return 输出目录路径
 * 
 * 获取系统输出目录，用于存放各种输出文件，如果目录不存在则自动创建。
 * 目录路径基于生成目录下的outputs子目录。
 */
const char* WtHelper::getOutputDir()
{
	static std::string folder = StrUtil::standardisePath(_gen_dir) + "outputs/";
	if (!StdFile::exists(folder.c_str()))
		boost::filesystem::create_directories(folder);
	return folder.c_str();
}

/**
 * @brief 获取基础目录
 * @return 基础目录路径
 * 
 * 获取系统的基础生成目录，如果目录不存在则自动创建。
 * 这是所有其他子目录的根目录。
 */
const char* WtHelper::getBaseDir()
{
	static std::string folder = StrUtil::standardisePath(_gen_dir);
	if (!StdFile::exists(folder.c_str()))
		boost::filesystem::create_directories(folder);
	return folder.c_str();
}